<?php
//require_once ("C_krn_consts.php");
require_once ("C_krn_net.php"); ("C_krn_tools.php");
//require_once ("C_krn_exception.php");
class c_motor {
	// Tipo de Motor de la Base de Daos
	private $Motor;
	
	/* Evitamos el clonaje del objeto. Patrón Singleton */
	private function __clone() {
	}
	private function __wakeup() {
	}
	public function getMotor() {
		return $this->Motor;
	}
	private function setMotor($pMotor) {
		$this->Motor = $pMotor;
	}
	function __construct($pBDMOTOR) {
		global $cAUDIT;
		global $IDIOMA, $language;
		
		try {
			// Inicializamos la identificación de BD
			$this->setMotor ( $pBDMOTOR );
			$this->TimeQuery = 0;
			$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "::constructor (" . __CLASS__ . ")" );
			return true;
		} catch ( Exception $e ) {
			$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $e->getMessage () );
		}
	}
	
	// Conectarse a la BD
	public function ConectarBD($pSERVIDOR, $pUSUARIO, $pPASSWORD, $pBD) {
		global $cAUDIT;
		global $IDIOMA, $language;
		
		try {
			// Conectarse a la BD o no
			$cAUDIT->AddAudit ( AUDIT_DB, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [4] . $pSERVIDOR . " (" . $pUSUARIO . ")" );
			
			$r = new mysqli ( $pSERVIDOR, $pUSUARIO, $pPASSWORD, $pBD );
			
			if (mysqli_connect_errno ()) {
				$cAUDIT->AddAudit ( AUDIT_DB, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, mysqli_connect_error () );
				die ( 1 );
			} else {
				$cAUDIT->AddAudit ( AUDIT_DB, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [5] . $pSERVIDOR . " (" . $pUSUARIO . ")" );
			}
			
			/* cambiar el conjunto de caracteres a utf8 */
			if (! $r->set_charset ( "utf8" )) {
				$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [40] . $pSERVIDOR . " " . $r->error );
			} else {
				$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [41] . $pSERVIDOR . " " . $r->character_set_name () );
			}
			
			// Se devuelve esto $r = new mysqli($pSERVIDOR, $pUSUARIO, $pPASSWORD, $pBD );
			return $r;
		} catch ( Exception $e ) {
			$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $e->getMessage () );
		}
	}
	private $TimeQuery;
	public function getTimeQUERY() {
		global $cAUDIT;
		try {
			static $querytime_begin;
			
			list ( $usec, $sec ) = explode ( ' ', microtime () );
			
			if (! isset ( $querytime_begin )) {
				$querytime_begin = (( float ) $usec + ( float ) $sec);
			} else {
				$querytime = ((( float ) $usec + ( float ) $sec)) - $querytime_begin;
				return $querytime;
			}
		} catch ( Exception $e ) {
			$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $e->getMessage () );
		}
	}
	public function QueryBDi_Campos($pMYSQLi) {
		
		// Calculamos el número de campos extraidos
		$field = $pMYSQLi->field_count;
		
		return $field;
	}
	public function QueryBDi_Filas($pMYSQLi) {
		
		// Calculamos el número de filas extraidos
		$count = $pMYSQLi->affected_rows;
		
		return $count;
	}
	public function QueryBDi_Execute($pMYSQLi, $q) {
		global $cAUDIT;
		
		// Iniciamos contador de tiempo
		$this->getTimeQUERY ();
		
		// Ejecutamos la consulta
		if ($result = mysqli_query ( $pMYSQLi, $q )) {
			
			// Fin contador de tiempo
			$this->TimeQuery = $this->getTimeQUERY ();
			
			// Log con la sentencia
			$cAUDIT->AddAudit ( AUDIT_DB_SQL, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $q );
			$cAUDIT->AddAudit ( AUDIT_DB,     __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "Rows: " . $pMYSQLi->affected_rows . " Fields: " . $pMYSQLi->field_count . " Time: " . $this->TimeQuery );
		} else {
	  	$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, 'SQL_ERROR: ' . $q );
			$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $pMYSQLi->errno );
			$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $pMYSQLi->error_list );
			$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $pMYSQLi->error );
		}
		
		return $result;
	}
	public function QueryBDi_LiberarQuery($q) {
		mysqli_free_result ( $q );
		
		return true;
	}
	
	function mysql_query_fetch_ROW($r, $n, $tipo_de_array = MYSQLI_BOTH ) {
		global $cAUDIT;
		   
		$row = mysqli_fetch_array ( $r, $tipo_de_array );
           
		// Si solo hay una linea lo muestro como tabla, sino como fila
		$max_key = 0;
		$max_value = 0;
		$total_campos = 0;
		
		if (is_array($row)) {		
		
			// Calcular la longitud máxima del campo para que quede bien formateadoo
			foreach ( $row as $key => $value ) {
				$total_campos += 1;
				if (strlen ( $key ) > $max_key) {
					$max_key = strlen ( $key );
				}
				if (strlen ( $value ) > $max_value) {
					$max_value = strlen ( $value );
				}
			}
			
			$total_campos = round($total_campos / 10);
			$linea = '';
			$campos = 0;
			$anterior = '';
			
			// Si solo hay una linea lo muestro como tabla, sino como fila
			// Una fila
			
			
			if ($n ==1) {
				foreach ( $row as $key => $value ) {		
					$campos += 1;
				
					if (($campos % 2) == 0) {			
						$linea = str_pad ( ' ', 2, " ", STR_PAD_RIGHT );
						$linea .= str_pad ( $key, $max_key, " ", STR_PAD_LEFT ) . " [" . str_pad ( $anterior, $total_campos, " ", STR_PAD_LEFT ) . "]" . "  -> " . "{ " . str_pad ( $value, $max_value, " ", STR_PAD_LEFT ) . " }";
						$cAUDIT->AddAudit ( AUDIT_DB_SQL_FETCH, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $linea );
					} else
						$anterior = $key;
				}
		  } else {		  
		    // A pesar de que hay en el else se entra cuando hay varias filas en este procedimiento solo se entra una vez y en la siguiente fila volverá a entrar
        // Varias filas
        if ($tipo_de_array  == MYSQLI_BOTH) {
        	
        	foreach ( $row as $key => $value ) {
        	  // Como es un array asociativo de los 2 modos, solo muestro uno, el que no es numérico, solo el que tiene el campo con una variable
        	  if (!is_numeric($key)) {
					    $linea .= "[" . $key . "] = " . $value;
				    }
				  }
				  $cAUDIT->AddAudit ( AUDIT_DB_SQL_FETCH, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $linea );
			  }  
		  }
		}
		return $row;
	}
	
	private static $_instance;
	public static function getInstance($pBDMOTOR) {
		if (! (self::$_instance instanceof self)) {
			self::$_instance = new self ( $pBDMOTOR );
		}
		return self::$_instance;
	}
}
;

try {
	$MotorBD = c_motor::getInstance ( BD_MOTOR );
} catch ( Exception $e ) {
	global $cAUDIT;
	global $IDIOMA, $language;
	
	$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [2] . $e->getMessage () );
}

?>
